<?php
namespace app\common\exception;

/**
* 异常类工厂调用类
*/
class ThrowException
{
    const NOT_FOUND_MSG = 2000001;//404 Not Found
    const NOT_METHOD_MSG = 3000001;//第三方请求方法不支持
    const HOST_INVALID_MSG = 3000002;//host无效
    const URL_INVALID_MSG = 3000003;//url无效
    const NAMESPACE = 'app\\common\\exception\\';
    const DEFAULT_NAME = 'BaseException';

    /**
     * 外部公用方法
     * @param string $name 异常类名称
     * @param string $msg 信息提示
     * @param int $errorCode 错误码
     */
    public static function run($name = '', $errorCode = 0, $code = null)
    {
        if (empty($name)) {
            $name = self::DEFAULT_NAME;
        }

        $clsName = self::NAMESPACE . $name;
        if (class_exists($clsName)) {
            throw new $clsName($errorCode, $code);
        }
        
        $base_cls = self::NAMESPACE . self::DEFAULT_NAME;
        throw new $base_cls($errorCode, $code);
    }

    /**
     * 版本控制类异常
     * @param string $msg 信息提示
     * @param int $errorCode 错误码
     */
    public static function version($errorCode = 1000000)
    {
        // 1.不使用工厂类调用方式
        // throw new VersionException([
        //     'msg'		=> $msg,
		// 	'errorCode'	=> $errorCode
        // ]);

        // 2.使用工厂类调用方式
        self::run('VersionException', $errorCode);
    }

    /**
     * 客户端请求接口时返回参数错误时抛出
     * @param int $errorCode
     */
    public static function req($errorCode = 2000000)
    {
        self::run('ReqException', $errorCode);
    }

    /**
     * 模型层、调取第三方接口时返回数据空时抛出
     * @param int $errorCode
     */
    public static function res($errorCode = 3000000)
    {
        self::run('ResException', $errorCode);
    }
	
}